<?php
require_once 'BancoDeDados.php';
require_once 'EspacoCultural.php';
class Endereco {

    private $cod_endereco;
    private $logradouro;
    private $numero;
    private $cidade;
    private $estado;
    private $cep;
    private $bairro;
    private $complemento;
    private $vinculado;
    private $espaco;
    
    /**
     *
     * @return EspacoCultural
     */
    public function &getEspaco() {
        return $this->espaco;
    }
    
    /**
     *
     * @param EspacoCultural $espaco 
     */
    public function setEspaco(EspacoCultural &$espaco) {
        $this->espaco = &$espaco;
    }

    public function &getCod_endereco() {
        return $this->cod_endereco;
    }

    public function setCod_endereco(&$cod_endereco) {
        $this->cod_endereco = &$cod_endereco;
    }

    public function &getLogradouro() {
        return $this->logradouro;
    }

    public function setLogradouro(&$logradouro) {
        $this->logradouro = &$logradouro;
    }

    public function &getNumero() {
        return $this->numero;
    }

    public function setNumero(&$numero) {
        $this->numero = &$numero;
    }

    public function &getCidade() {
        return $this->cidade;
    }

    public function setCidade(&$cidade) {
        $this->cidade = &$cidade;
    }

    public function &getEstado() {
        return $this->estado;
    }

    public function setEstado(&$estado) {
        $this->estado = &$estado;
    }

    public function &getCep() {
        return $this->cep;
    }

    public function setCep(&$cep) {
        $this->cep = &$cep;
    }

    public function &getBairro() {
        return $this->bairro;
    }

    public function setBairro(&$bairro) {
        $this->bairro = &$bairro;
    }

    public function &getComplemento() {
        return $this->complemento;
    }

    public function setComplemento(&$complemento) {
        $this->complemento = &$complemento;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    /**
     * @method void cadastrar() para cadastro do recurso
     * Para que este possa ser utilizado ao menos a descrição não pode ser vazia
     * @return void
     */
    public function cadastrar() {
        $banco = BancoDeDados::getInstance();
        $link = &$banco->getLink();
        $stmt = &$link->prepare('insert into endereco (logradouro, numero, cidade, estado, cep, bairro, complemento, cod_espaco) values(?,?,?,?,?,?,?,?)');
        $result = &$link->execute($stmt, array($this->logradouro, $this->numero, $this->cidade, $this->estado, $this->cep, $this->bairro, $this->complemento, $this->espaco->getCod_espaco()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $result = &$banco->getLink()->query('select cod_endereco from endereco where logradouro = ? and numero = ? and cidade = ? and estado = ? and cep = ? and bairro = ? and complemento = ?', array(&$this->logradouro, $this->numero, $this->cidade, $this->estado, $this->cep, $this->bairro, $this->complemento));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $result->fetchInto($row);
        $this->cod_endereco = &$row['cod_endereco'];
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        $resultado = $campo_valor;
        if ($campo_id == 'logradouro' && $this->logradouro != $campo_valor) {
            $temp= &$this->logradouro;
            $this->logradouro= &$campo_valor;
        } elseif ($campo_id == 'numero' && $this->numero != $campo_valor) {
            $temp= &$this->numero;
            $this->numero= &$campo_valor;
        } elseif ($campo_id == 'cidade' && $this->cidade != $campo_valor) {
            $temp= &$this->cidade;
            $this->cidade= &$campo_valor;
        } elseif ($campo_id == 'estado' && $this->estado != $campo_valor) {
            $temp= &$this->estado;
            $this->estado= &$campo_valor;
        } elseif ($campo_id == 'cep' && $this->cep != $campo_valor) {
            $temp= &$this->cep;
            $this->cep= &$campo_valor;
        } elseif ($campo_id == 'bairro' && $this->bairro != $campo_valor) {
            $temp= &$this->bairro;
            $this->bairro= &$campo_valor;
        } elseif ($campo_id == 'complemento' && $this->complemento != $campo_valor) {
            $temp= &$this->complemento;
            $this->complemento= &$campo_valor;
        }
        if ($temp == $campo_valor) {
            //throw new Exception("no_action |$resultado");
            return;
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update endereco set ' . $campo_id . ' = ? where cod_endereco = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_endereco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}"." |".$temp);
        }
        $link->commit();
        return $resultado;
    }

    /**
     * @method void excluir() para exclusão do recurso
     * Para que este possa ser utilizado o cod_aquisicao não pode estar vazio
     * @return void
     */
    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from endereco where cod_endereco = ?');
        $result = $link->execute($stmt, array($this->cod_endereco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    /**
     * @method Endereco consultar(&$Cod_Endereco) para consulta do recurso
     * @static
     * @param integer $cod_endereco chave primária para consulta
     * @return Endereco retorna o recurso de acordo com a chave primária passada
     */
    public static function &consultar(&$cod_endereco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from endereco where cod_endereco = ?', array(&$cod_endereco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Endereço inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Endereço com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $endereco = new Endereco();
        $endereco->setBairro($row['bairro']);
        $endereco->setCep($row['cep']);
        $endereco->setCidade($row['cidade']);
        $endereco->setComplemento($row['complemento']);
        $endereco->setEstado($row['estado']);
        $endereco->setLogradouro($row['logradouro']);
        $endereco->setNumero($row['numero']);
        return $endereco;
    }
    
    /**
     * @method Endereco consultar(&$Cod_Endereco) para consulta do recurso
     * @static
     * @param integer $cod_espaco chave estrangeira para consulta
     * @return Endereco retorna o recurso de acordo com a chave primária passada
     */
    public static function &consultarPorEspaco(&$cod_espaco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from endereco where cod_espaco = ?', array(&$cod_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Endereço inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Endereço com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $endereco = new Endereco();
        $endereco->setBairro($row['bairro']);
        $endereco->setCep($row['cep']);
        $endereco->setCidade($row['cidade']);
        $endereco->setComplemento($row['complemento']);
        $endereco->setEstado($row['estado']);
        $endereco->setLogradouro($row['logradouro']);
        $endereco->setNumero($row['numero']);
        return $endereco;
    }
}
?>